package com;

import com.JVMProxy.StaticProxy.AffairTx;
import com.JVMProxy.pojo.User;
import com.JVMProxy.service.UserService;
import com.JVMProxy.service.impl.UserServiceImpl;
import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author cc
 * @date 2021/8/12 19:19
 * @Description
 */

public class RunProxy {

    //JDK代理：生成一个代理类对象
    /**
     * 三个参数的含义： 1、目标类的类加载器   2、目标类所有实现的接口   3、拦截器
     */
    //此处us是代理类对象

    private static UserService us =null;

    static {
        final Object target = new UserServiceImpl();

         us = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            /**
             * proxy:代理类代理的真实代理对象com.sun.proxy.$Proxy0
             * method:我们所要调用某个对象真实的方法的Method对象
             * args:指代代理对象方法传递的参数
             */
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if (method.getName().equals("addUser")||method.getName().equals("delectUser")){
                    AffairTx.commit();
                    Integer result =  (Integer)method.invoke(target, args);//args只能通过反编译才看的到
                    AffairTx.close();
                    return result;
                }
                return null;
            }
        });
    }
    @Test
    public void test1(){


        int count1 = us.addUser(new User("我是代理",99));
        System.out.println("新增成功:"+count1);

        System.out.println("==================================================");

        int count2 = us.delectUser("test");
        System.out.println("删除成功:"+count2);

        System.out.println(us.toString());

    }
}
